#ifndef LOG_FILE_H
#define LOG_FILE_H

#include <string>
#include <memory>
#include <mutex>

#include "FileUtil.h"

namespace Logger
{
    class LogFile
    {
    public:
        LogFile(const std::string &baseName, off_t rollSize, int rollCheckEveryN = 1024, int flushInterval = 3);
        bool rollFile();

        void append(const char *data, int size);
        void flush();

    private:
        static std::string getLogFileName(const std::string &basename, time_t *now);

        void appendInlock(const char *data, int len);

        std::string baseName_; // 运行程序文件名，如testLogger.cpp，依据该名构造日志文件名
        off_t rollSize_;       // 文件滚动大小，单位B，到达该值后需要滚动
        int rollCheckEveryN_;  // 滚动检查，每写n B检查是否需要滚动
        int flushInterval_;    // 刷新间隔，单位s

        time_t startPeriod_; // 本次写周期的起始时间，单位s
        time_t lastRoll_;    // 上次滚动时间，单位s
        time_t lastFlush_;   // 上次刷新时间，单位s

        static const int sDaySeconds = 24 * 60 * 60; // 一天的秒数
        std::unique_ptr<FileUtil> file_;             // 向底层FileUtil写数据
        std::mutex mtx_;
        int writeCnt_; // 写入次数计数, 超过rollCheckEveryN_重新计数
    };
} // namespace Logger

#endif // LOG_FILE_H